import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import updateLocale from 'dayjs/plugin/updateLocale';
import isLeapYear from 'dayjs/plugin/isLeapYear';
import 'dayjs/locale/zh-cn';

// 本地化语言
dayjs.extend(isLeapYear);
dayjs.locale('zh-cn');

// 格式化时间
dayjs.extend(updateLocale);
dayjs.updateLocale('zh-cn', {
  relativeTime: {
    future: '%s后',
    past: '%s前',
    s: '几秒',
    m: '1分钟',
    mm: '%d分钟',
    h: '1小时',
    hh: '%d小时',
    d: '1天',
    dd: '%d天',
    M: '1个月',
    MM: '%d个月',
    y: '1年',
    yy: '%d年',
  },
});

// 相对时间
dayjs.extend(relativeTime);

/**
 * 获取相对时间（如：相对过去时间，几秒前，1小时间前等；相对未来时间，1年后等）
 * @param date 日期
 * @returns
 */
export const getDayAgo = (date: string) => dayjs(date).fromNow();

/**
 * 获取当前时间
 * @param form 日期格式
 * @returns
 */
export const getNow = (form: string = 'YYYY-MM-DD HH:mm:ss') => dayjs().format(form);

/**
 * 根据简易时间字符串获取到期时间戳
 * @param duration 时间段
 * @returns
 */
export const getExpireTimestamp = (duration: string): number => {
  const now = dayjs();
  const regex = /^(\d+)([smhdwMy])$/;
  const match = duration.match(regex);

  if (!match) {
    throw new Error('Unsupported duration format');
  }

  const [_, number, unit] = match;
  const amount = parseInt(number, 10);

  switch (unit) {
    case 's': // 秒
      return now.add(amount, 'second').unix();
    case 'm': // 分
      return now.add(amount, 'minute').unix();
    case 'h': // 时
      return now.add(amount, 'hour').unix();
    case 'd': // 日
      return now.add(amount, 'day').unix();
    case 'w': // 周
      return now.add(amount, 'week').unix();
    case 'M': // 月
      return now.add(amount, 'month').unix();
    case 'y': // 年
      return now.add(amount, 'year').unix();
    default:
      throw new Error('Unsupported duration format');
  }
};
